import NIOSSL
import Fluent
import FluentPostgresDriver
import Vapor
import JWT
import Redis

/*
注意：数据库连接参数（如主机名、用户名、密码等）最好通过环境变量设置，尤其是在生产环境中，以避免敏感信息硬编码在代码中。
*/
// configures your application
public func configure(_ app: Application) async throws {

    /*
     FileMiddleware 是 Vapor 的一个内置中间件，它的核心作用是：

     静态文件服务：监听传入的 HTTP 请求，检查其路径是否与应用程序指定公共目录（默认为 Public/）下的文件匹配。

     自动映射：如果找到匹配的文件，中间件会直接返回该文件的内容，并自动设置正确的 Content-Type 头（例如，.html 文件为 text/html，.css 文件为 text/css，.jpg 文件为 image/jpeg 等）。

     短路请求：如果请求已被 FileMiddleware 处理（即找到了文件），该请求将不会继续传递到后续的路由或中间件，从而提升性能。
     
     在 Xcode 中运行：确保 Xcode 的工作目录设置为项目根目录（包含 Package.swift 的目录）。可以通过 Edit Scheme -> Run -> Options -> Working Directory 设置。
     
     */
    app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
    
    
    // 注册自定义中间件
    // 错误处理中间件应该尽早添加，以捕获后续中间件和路由抛出的错误
    app.middleware.use(ApiErrorMiddleware())
    
    //    配置JWT
    try await JWTConfig.configure(app: app)
    
    
    //    注册Redis
    let redisConfig = try RedisConfiguration(
                hostname: Environment.get("REDIS_HOST") ?? "localhost",
                port: Environment.get("REDIS_PORT").flatMap(Int.init(_:)) ?? 6379,
                password: Environment.get("REDIS_PASSWORD") ?? "123456",
                pool: .init(connectionRetryTimeout: .milliseconds(100))
            )
    print("Redis Config: \(redisConfig)")
    app.redis.configuration = redisConfig

    //    注册数据库
    app.databases.use(DatabaseConfigurationFactory.postgres(configuration: .init(
        hostname: Environment.get("DATABASE_HOST") ?? "localhost",
        port: Environment.get("DATABASE_PORT").flatMap(Int.init(_:)) ?? SQLPostgresConfiguration.ianaPortNumber,
        username: Environment.get("DATABASE_USERNAME") ?? "postgres",
        password: Environment.get("DATABASE_PASSWORD") ?? "postgres",
        database: Environment.get("DATABASE_NAME") ?? "postgres",
        tls: .prefer(try .init(configuration: .clientDefault)))
    ), as: .psql)

    // 注册迁移
    app.migrations.add(CreateUser(), to: .psql)
    app.migrations.add(AddUserPassword(), to: .psql)
    app.migrations.add(CreateListData(), to: .psql) 
  
    // 可选：在开发环境下，每次启动自动运行迁移（生产环境建议手动控制）
    if app.environment == .development {
//        try await app.autoMigrate()
//        try await app.autoRevert()
    }
    
    // register routes
    try routes(app)
    
    // 将流体收集限制增加到500kb
    app.routes.defaultMaxBodySize = "500kb"
     
}
